/**
 *
 * @property {Object} data 版本信息
 *
 * —— @property {String} installPackage 安装包地址
 * —— @property {String} prompt 更新提示
 * —— @property {Number} upgradeType 更新类型 1:强制更新 2:强提示更新 3:弱提示更新
 * —— @property {String} versionName 版本名称
 * —— @property {Number} versionNum 版本号
 *
 */

import $store from '@/store'
import platform from '@/util/platform'
// 主颜色
const $mainColor = '#EFB371'
// 弹窗图标url
// 图片宽高
const logoWidth = 162
const logoHeight = 140
// 按钮高度
const buttonHeight = 40
// title样式
const titleStyle = {
	color: '#EDAF6B',
	size: '18px',
	weight: '500'
}
// content样式
const contentStyle = {
	color: '#666666',
	size: '13px',
	weight: '400'
}
// 弹框宽度百分比 0-1
const popupWidthScale = 0.78

// 从服务器下载应用资源包
const getDownload = function (data) {
	let dtask
	let popupData = {
		progress: true,
		buttonNum: 2
	}
	if (data.upgradeType === 1) {
		popupData.buttonNum = 1
	}
	let lastProgressValue = 0
	let popupObj = downloadPopup(popupData)
	dtask = plus.downloader.createDownload(data.installPackage, {}, function (download, status) {
		if (status == 200) {
			// popupObj.change({
			// 	progressValue: 100,
			// 	progressTip: '正在安装文件...',
			// 	progress: true,
			// 	buttonNum: 0
			// })
			plus.runtime.install(
				download.filename,
				{},
				function () {
					popupObj.change({
						contentText: '下载完成，请安装后重新启动！',
						buttonNum: 1,
						progress: false,
						complete: true
					})
				},
				function (e) {
					popupObj.cancel()
					plus.nativeUI.alert('安装文件失败[' + e.code + ']：' + e.message)
				}
			)
		}
	})
	dtask.start()
	dtask.addEventListener('statechanged', function (task, status) {
		switch (task.state) {
			case 1: // 开始
				popupObj.change({
					progressValue: 0,
					progressTip: '准备下载...',
					progress: true
				})
				break
			case 2: // 已连接到服务器
				popupObj.change({
					progressValue: 0,
					progressTip: '开始下载...',
					progress: true
				})
				break
			case 3:
				const progress = parseInt((task.downloadedSize / task.totalSize) * 100)
				if (progress - lastProgressValue >= 2) {
					lastProgressValue = progress
					popupObj.change({
						progressValue: progress,
						progressTip: '已下载' + progress + '%',
						progress: true
					})
				}
				break
		}
	})
	// 取消下载
	popupObj.cancelDownload = function () {
		dtask && dtask.abort()
		uni.showToast({
			title: '已取消下载',
			icon: 'none'
		})
	}
	// 重启APP
	popupObj.reboot = function () {
		plus.runtime.restart()
	}
}

// 文字换行
function drawtext(text, maxWidth) {
	let textArr = text.split('')
	let len = textArr.length
	// 上个节点
	let previousNode = 0
	// 记录节点宽度
	let nodeWidth = 0
	// 文本换行数组
	let rowText = []
	// 如果是字母，侧保存长度
	let letterWidth = 0
	// 汉字宽度
	let chineseWidth = 14
	// otherFont宽度
	let otherWidth = 7
	for (let i = 0; i < len; i++) {
		if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) {
			if (letterWidth > 0) {
				if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) {
					rowText.push({
						type: 'text',
						content: text.substring(previousNode, i)
					})
					previousNode = i
					nodeWidth = chineseWidth
					letterWidth = 0
				} else {
					nodeWidth += chineseWidth + letterWidth * otherWidth
					letterWidth = 0
				}
			} else {
				if (nodeWidth + chineseWidth > maxWidth) {
					rowText.push({
						type: 'text',
						content: text.substring(previousNode, i)
					})
					previousNode = i
					nodeWidth = chineseWidth
				} else {
					nodeWidth += chineseWidth
				}
			}
		} else {
			if (/\n/g.test(textArr[i])) {
				rowText.push({
					type: 'break',
					content: text.substring(previousNode, i)
				})
				previousNode = i + 1
				nodeWidth = 0
				letterWidth = 0
			} else if (textArr[i] == '\\' && textArr[i + 1] == 'n') {
				rowText.push({
					type: 'break',
					content: text.substring(previousNode, i)
				})
				previousNode = i + 2
				nodeWidth = 0
				letterWidth = 0
			} else if (/[a-zA-Z0-9]/g.test(textArr[i])) {
				letterWidth += 1
				if (nodeWidth + letterWidth * otherWidth > maxWidth) {
					rowText.push({
						type: 'text',
						content: text.substring(previousNode, i + 1 - letterWidth)
					})
					previousNode = i + 1 - letterWidth
					nodeWidth = letterWidth * otherWidth
					letterWidth = 0
				}
			} else {
				if (nodeWidth + otherWidth > maxWidth) {
					rowText.push({
						type: 'text',
						content: text.substring(previousNode, i)
					})
					previousNode = i
					nodeWidth = otherWidth
				} else {
					nodeWidth += otherWidth
				}
			}
		}
	}
	if (previousNode < len) {
		rowText.push({
			type: 'text',
			content: text.substring(previousNode, len)
		})
	}
	return rowText
}

// 是否更新弹窗
function updatePopup(data, callback) {
	// 弹窗遮罩层
	let maskLayer = new plus.nativeObj.View('maskLayer', {
		//先创建遮罩层
		top: '0px',
		left: '0px',
		height: '100%',
		width: '100%',
		backgroundColor: 'rgba(0,0,0,0.5)'
	})

	// 以下为计算菜单的nview绘制布局，为固定算法，使用者无关关心
	const screenWidth = plus.screen.resolutionWidth
	const screenHeight = plus.screen.resolutionHeight
	//弹窗容器宽度
	const popupViewWidth = screenWidth * popupWidthScale
	// 弹窗容器的Padding
	const viewContentPadding = 20
	// 弹窗容器的宽度
	const viewContentWidth = parseInt(popupViewWidth - viewContentPadding * 2)
	// 描述的列表
	const descriptionList = drawtext(data.prompt, viewContentWidth)

	// 弹窗容器高度
	let popupViewHeight = logoHeight + 20 + 20 + 90 + 10 + 30

	let popupViewContentList = [
		{
			src: $iconUrl,
			id: 'logo',
			tag: 'img',
			position: {
				top: '0px',
				left: (popupViewWidth - logoWidth) / 2 + 'px',
				width: logoWidth + 'px',
				height: logoHeight + 'px'
			}
		},
		{
			tag: 'font',
			id: 'title',
			text: '发现新版本' + data.versionName,
			textStyles: {
				size: titleStyle.size,
				color: titleStyle.color,
				weight: titleStyle.weight,
				whiteSpace: 'normal'
			},
			position: {
				top: '148px',
				left: viewContentPadding + 'px',
				width: viewContentWidth + 'px',
				height: '30px'
			}
		}
	]
	const textHeight = 18
	let contentTop = 188
	descriptionList.forEach((item, index) => {
		if (index > 0) {
			popupViewHeight += textHeight
			contentTop += textHeight
		}
		popupViewContentList.push({
			tag: 'font',
			id: 'content' + index + 1,
			text: item.content,
			textStyles: {
				size: contentStyle.size,
				color: contentStyle.color,
				weight: contentStyle.weight,
				lineSpacing: '50%',
				align: 'left'
			},
			position: {
				top: contentTop + 'px',
				left: viewContentPadding + 'px',
				width: viewContentWidth + 'px',
				height: textHeight + 'px'
			}
		})
		if (item.type == 'break') {
			contentTop += 10
			popupViewHeight += 10
		}
	})

	if (data.upgradeType === 1) {
		popupViewContentList.push({
			tag: 'rect', //绘制底边按钮
			rectStyles: {
				radius: '6px',
				color: $mainColor
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: viewContentPadding + 'px',
				width: viewContentWidth + 'px',
				height: buttonHeight + 'px'
			}
		})
		popupViewContentList.push({
			tag: 'font',
			id: 'confirmText',
			text: '立即更新',
			textStyles: {
				size: '15px',
				color: '#FFF',
				lineSpacing: '0%'
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: viewContentPadding + 'px',
				width: viewContentWidth + 'px',
				height: buttonHeight + 'px'
			}
		})
	} else {
		// 绘制底边按钮
		popupViewContentList.push({
			tag: 'rect',
			id: 'cancelBox',
			rectStyles: {
				radius: '3px',
				borderColor: '#f1f1f1',
				borderWidth: '1px'
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: viewContentPadding + 'px',
				width: (viewContentWidth - viewContentPadding) / 2 + 'px',
				height: buttonHeight + 'px'
			}
		})
		popupViewContentList.push({
			tag: 'rect',
			id: 'confirmBox',
			rectStyles: {
				radius: '3px',
				color: $mainColor
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: (viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2 + 'px',
				width: (viewContentWidth - viewContentPadding) / 2 + 'px',
				height: buttonHeight + 'px'
			}
		})
		popupViewContentList.push({
			tag: 'font',
			id: 'cancelText',
			text: data.upgradeType === 3 ? '跳过该版本' : '下次再说',
			textStyles: {
				size: '15px',
				color: '#666',
				lineSpacing: '0%',
				whiteSpace: 'normal'
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: viewContentPadding + 'px',
				width: (viewContentWidth - viewContentPadding) / 2 + 'px',
				height: buttonHeight + 'px'
			}
		})
		popupViewContentList.push({
			tag: 'font',
			id: 'confirmText',
			text: '立即更新',
			textStyles: {
				size: '15px',
				color: '#FFF',
				lineSpacing: '0%',
				whiteSpace: 'normal'
			},
			position: {
				bottom: viewContentPadding + 'px',
				left: (viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2 + 'px',
				width: (viewContentWidth - viewContentPadding) / 2 + 'px',
				height: buttonHeight + 'px'
			}
		})
	}
	// 弹窗内容
	let popupView = new plus.nativeObj.View('popupView', {
		//创建底部图标菜单
		tag: 'rect',
		top: (screenHeight - popupViewHeight) / 2 + 'px',
		left: (1 -  popupWidthScale) / 2 * 100 + '%',
		height: popupViewHeight + 'px',
		width: popupWidthScale * 100 + '%'
	})
	// 绘制白色背景
	popupView.drawRect(
		{
			color: '#FFFFFF',
			radius: '8px'
		},
		{
			top: '40px',
			height: popupViewHeight - 40 + 'px'
		}
	)

	popupView.draw(popupViewContentList)
	popupView.addEventListener('click', function (e) {
		let maxTop = popupViewHeight - viewContentPadding
		let maxLeft = popupViewWidth - viewContentPadding
		let buttonWidth = (viewContentWidth - viewContentPadding) / 2
		if (e.clientY > maxTop - buttonHeight && e.clientY < maxTop) {
			if (data.upgradeType === 1) {
				// 强制更新 立即更新
				if (e.clientX > viewContentPadding && e.clientX < maxLeft) {
					if (/\.wgt$/i.test(data.installPackage) || platform.os == 'android') {
						maskLayer.hide()
						popupView.hide()
					}
					callback && callback()
				}
			} else {
				// 非强制更新
				if (
					e.clientX > viewContentPadding &&
					e.clientX < maxLeft - buttonWidth - viewContentPadding
				) {
					// 取消
					if (data.upgradeType === 3) {
						// 跳过该版本
						maskLayer.hide()
						popupView.hide()
						$store('app').setIgnoreVersion(data.versionNum)
					} else {
						// 下次再说
						maskLayer.hide()
						popupView.hide()
					}
				} else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
					// 立即更新
					maskLayer.hide()
					popupView.hide()
					callback && callback()
				}
			}
		}
	})
	if (data.upgradeType !== 1) {
		// 点击遮罩层
		maskLayer.addEventListener('click', function () {
			//处理遮罩层点击
			maskLayer.hide()
			popupView.hide()
		})
	}
	// 显示弹窗
	maskLayer.show()
	popupView.show()
}

// 文件下载的弹窗绘图
function downloadPopupDrawing(data) {
	// 以下为计算菜单的nview绘制布局，为固定算法，使用者无关关心
	const screenWidth = plus.screen.resolutionWidth
	const screenHeight = plus.screen.resolutionHeight
	//弹窗容器宽度
	const popupViewWidth = screenWidth * popupWidthScale
	// 弹窗容器的Padding
	const viewContentPadding = 20
	// 弹窗容器的宽度
	const viewContentWidth = popupViewWidth - viewContentPadding * 2
	// 弹窗容器高度
	let popupViewHeight = viewContentPadding * 3 + 60
	let progressTip = data.progressTip || '准备下载...'
	let contentText = data.contentText || '正在为您更新，请耐心等待'
	let elementList = [
		{
			tag: 'rect', //背景色
			color: '#FFFFFF',
			rectStyles: {
				radius: '8px'
			}
		},
		{
			tag: 'font',
			id: 'title',
			text: '升级APP',
			textStyles: {
				size: titleStyle.size,
				color: titleStyle.color,
				weight: titleStyle.weight,
				verticalAlign: 'middle',
				whiteSpace: 'normal'
			},
			position: {
				top: viewContentPadding + 'px',
				height: '30px'
			}
		},
		{
			tag: 'font',
			id: 'content',
			text: contentText,
			textStyles: {
				size: contentStyle.size,
				color: contentStyle.color,
				weight: contentStyle.weight,
				verticalAlign: 'middle',
				whiteSpace: 'normal'
			},
			position: {
				top: viewContentPadding * 2 + 30 + 'px',
				height: '20px'
			}
		}
	]
	// 是否有进度条
	if (data.progress) {
		popupViewHeight += viewContentPadding + 40
		elementList = elementList.concat([
			{
				tag: 'font',
				id: 'progressValue',
				text: progressTip,
				textStyles: {
					size: '14px',
					color: $mainColor,
					whiteSpace: 'normal'
				},
				position: {
					top: viewContentPadding * 4 + 20 + 'px',
					height: '30px'
				}
			},
			{
				tag: 'rect', //绘制进度条背景
				id: 'progressBg',
				rectStyles: {
					radius: '4px',
					borderColor: '#f1f1f1',
					borderWidth: '1px'
				},
				position: {
					top: viewContentPadding * 4 + 60 + 'px',
					left: viewContentPadding + 'px',
					width: viewContentWidth + 'px',
					height: '8px'
				}
			}
		])
	}
	// 两个按钮 取消下载 后台下载
	if (data.buttonNum == 2) {
		popupViewHeight += viewContentPadding + buttonHeight
		elementList = elementList.concat([
			{
				tag: 'rect', //绘制底边按钮
				rectStyles: {
					radius: '3px',
					borderColor: '#f1f1f1',
					borderWidth: '1px'
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: viewContentPadding + 'px',
					width: (viewContentWidth - viewContentPadding) / 2 + 'px',
					height: buttonHeight + 'px'
				}
			},
			{
				tag: 'rect', //绘制底边按钮
				rectStyles: {
					radius: '3px',
					color: $mainColor
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: (viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2 + 'px',
					width: (viewContentWidth - viewContentPadding) / 2 + 'px',
					height: buttonHeight + 'px'
				}
			},
			{
				tag: 'font',
				id: 'cancelText',
				text: '取消下载',
				textStyles: {
					size: '15px',
					color: '#666',
					lineSpacing: '0%',
					whiteSpace: 'normal'
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: viewContentPadding + 'px',
					width: (viewContentWidth - viewContentPadding) / 2 + 'px',
					height: buttonHeight + 'px'
				}
			},
			{
				tag: 'font',
				id: 'confirmText',
				text: '后台下载',
				textStyles: {
					size: '15px',
					color: '#FFF',
					lineSpacing: '0%',
					whiteSpace: 'normal'
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: (viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2 + 'px',
					width: (viewContentWidth - viewContentPadding) / 2 + 'px',
					height: buttonHeight + 'px'
				}
			}
		])
	}
	// 一个按钮 重新启动 有进度条说明在下载中不显示
	if (data.buttonNum == 1 && !data.progress) {
		popupViewHeight += viewContentPadding + buttonHeight
		elementList = elementList.concat([
			{
				tag: 'rect', //绘制底边按钮
				rectStyles: {
					radius: '6px',
					color: $mainColor
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: viewContentPadding + 'px',
					width: viewContentWidth + 'px',
					height: buttonHeight + 'px'
				}
			},
			{
				tag: 'font',
				id: 'confirmText',
				text: '立即重启',
				textStyles: {
					size: '15px',
					color: '#FFF',
					lineSpacing: '0%'
				},
				position: {
					bottom: viewContentPadding + 'px',
					left: viewContentPadding + 'px',
					width: viewContentWidth + 'px',
					height: buttonHeight + 'px'
				}
			}
		])
	}
	return {
		popupViewHeight: popupViewHeight,
		popupViewWidth: popupViewWidth,
		screenHeight: screenHeight,
		viewContentWidth: viewContentWidth,
		viewContentPadding: viewContentPadding,
		elementList: elementList
	}
}

// 文件下载的弹窗
function downloadPopup(data) {
	// 弹窗遮罩层
	let maskLayer = new plus.nativeObj.View('maskLayer', {
		//先创建遮罩层
		top: '0px',
		left: '0px',
		height: '100%',
		width: '100%',
		backgroundColor: 'rgba(0,0,0,0.5)'
	})
	let popupViewData = downloadPopupDrawing(data)
	// 弹窗内容
	let popupView = new plus.nativeObj.View('popupView', {
		//创建底部图标菜单
		tag: 'rect',
		top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + 'px',
		left: (1 -  popupWidthScale) / 2 * 100 + '%',
		height: popupViewData.popupViewHeight + 'px',
		width: popupWidthScale * 100 + '%'
	})
	let progressValue = 0
	let progressTip = 0
	let contentText = 0
	let buttonNum = 2
	if (data.buttonNum >= 0) {
		buttonNum = data.buttonNum
	}
	let complete = false
	popupView.draw(popupViewData.elementList)
	let callbackData = {
		change: function (res) {
			let progressElement = []
			if (res.progressValue) {
				progressValue = res.progressValue
				// 绘制进度条
				progressElement.push({
					tag: 'rect', //绘制进度条背景
					id: 'progressValueBg',
					rectStyles: {
						radius: '4px',
						color: $mainColor
					},
					position: {
						top: popupViewData.viewContentPadding * 4 + 60 + 'px',
						left: popupViewData.viewContentPadding + 'px',
						width: popupViewData.viewContentWidth * (res.progressValue / 100) + 'px',
						height: '8px'
					}
				})

				if (res.progressValue >= 100) {
					maskLayer.show()
					popupView.show()
				}
			}
			if (res.progressTip) {
				progressTip = res.progressTip
				progressElement.push({
					tag: 'font',
					id: 'progressValue',
					text: res.progressTip,
					textStyles: {
						size: '14px',
						color: $mainColor,
						whiteSpace: 'normal'
					},
					position: {
						top: popupViewData.viewContentPadding * 4 + 20 + 'px',
						height: '30px'
					}
				})
			}
			if (res.contentText) {
				contentText = res.contentText
				progressElement.push({
					tag: 'font',
					id: 'content',
					text: res.contentText,
					textStyles: {
						size: contentStyle.size,
						color: contentStyle.color,
						weight: contentStyle.weight,
						whiteSpace: 'normal'
					},
					position: {
						top: popupViewData.viewContentPadding * 2 + 30 + 'px',
						height: '30px'
					}
				})
			}
			if (res.complete) {
				complete = res.complete
				if (res.buttonNum > 0) {
					buttonNum = res.buttonNum
				}
				popupView.reset()
				popupViewData = downloadPopupDrawing(
					Object.assign(
						{
							progressValue: progressValue,
							progressTip: progressTip,
							contentText: contentText
						},
						res
					)
				)
				let newElement = []
				popupViewData.elementList.map((item, index) => {
					let have = false
					progressElement.forEach((childItem, childIndex) => {
						if (item.id == childItem.id) {
							have = true
						}
					})
					if (!have) {
						newElement.push(item)
					}
				})
				progressElement = newElement.concat(progressElement)
				popupView.setStyle({
					tag: 'rect',
					top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + 'px',
					left: (1 -  popupWidthScale) / 2 * 100 + '%',
					height: popupViewData.popupViewHeight + 'px',
					width: popupWidthScale * 100 + '%'
				})
				popupView.draw(progressElement)
			} else {
				popupView.draw(progressElement)
			}
		},
		cancel: function () {
			maskLayer.hide()
			popupView.hide()
		}
	}
	popupView.addEventListener('click', function (e) {
		let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding
		let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding
		if (e.clientY > maxTop - 40 && e.clientY < maxTop) {
			if (buttonNum == 1 && complete) {
				// 重启APP
				if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) {
					maskLayer.hide()
					popupView.hide()
					callbackData.reboot()
				}
			} else if (buttonNum == 2) {
				let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2
				if (
					e.clientX > popupViewData.viewContentPadding &&
					e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding
				) {
					// 取消下载
					maskLayer.hide()
					popupView.hide()
					callbackData.cancelDownload()
				} else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
					// 后台下载
					maskLayer.hide()
					popupView.hide()
				}
			}
		}
	})
	// 显示弹窗
	maskLayer.show()
	popupView.show()
	// 改变进度条
	return callbackData
}

export default function (data) {
	updatePopup(data, function () {
		if (/\.wgt$/i.test(data.installPackage) || platform.os == 'android') {
			getDownload(data)
		} else {
			plus.runtime.openURL(data.installPackage)
		}
	})
}
